#include <openssl/bn.h>

int inv_mod_bn(const char *x, const char *m, char **rez) {
	int rc = 0;

	BIGNUM *s = NULL;
	BN_dec2bn(&s, x);

	BIGNUM *q = NULL;
	BN_dec2bn(&q, m);

	BIGNUM *w = BN_new();
	BN_CTX *ctx = BN_CTX_new();
	if(ctx == NULL)
		return 1;

	/* compute w == inv(s) (mod q) */
	BN_init(w);
	if ((BN_mod_inverse(w, s, q, ctx)) == NULL)
		return 1;

	*rez = BN_bn2dec(w);
	if (!rez)
		return 1;

	BN_CTX_free(ctx);

	BN_free(s);
	BN_free(q);
	BN_free(w);

	return rc;
}
